﻿using System;
using System.Web;
using System.Configuration;
using System.Web.Caching;

namespace LanguageInfo.Common.Utilities
{
	/// <summary>
	/// 描述：对缓存操作进行封装
	/// 作者：路晓阳
	/// 时间：2010-6-1
	/// </summary>
	public static class CacheHelper
	{
		#region 获取Cache对象
		public static Cache Cache
		{
			get
			{
				if (null != HttpContext.Current)
					return HttpContext.Current.Cache;
				else
					return HttpRuntime.Cache;
			}
		}
		public static string AppPrefix
		{
			get
			{
				return AppDomain.CurrentDomain.Id.ToString();
			}
		}
		#endregion

		#region  获取缓存内容
		/// <summary>
		/// 获取缓存内容
		/// </summary>
		/// <param name="key"></param>
		/// <returns></returns>
		public static object Get(string key)
		{
			return Cache.Get(AppPrefix + key);
		}
		#endregion

		#region 设置缓存

		/// <summary>
		/// 
		/// </summary>
		/// <param name="key"></param>
		/// <param name="value"></param>
		public static void Set(string key, object value)
		{
            if (value != null)
			    Cache.Insert(AppPrefix + key, value);
		}

		/// <summary>
		/// 设置缓存
		/// </summary>
		/// <param name="name"></param>
		/// <param name="value"></param>
		/// <param name="cacheDependency">所插入对象的文件依赖项或缓存键依赖项。当任何依赖项更改时，该对象即无效，并从缓存中移除。如果没有依赖项，则此参数包含 nullNothingnullptrnull 引用（在 Visual Basic 中为 Nothing）。</param>
		public static void Set(string key, object value, CacheDependency cacheDependency)
		{
            if (value != null)
			    Cache.Insert(AppPrefix + key, value, cacheDependency);
		}


		/// <summary>
		/// 设置缓存
		/// </summary>
		/// <param name="name"></param>
		/// <param name="value"></param>
		/// <param name="cacheDependency">所插入对象的文件依赖项或缓存键依赖项。当任何依赖项更改时，该对象即无效，并从缓存中移除。如果没有依赖项，则此参数包含 nullNothingnullptrnull 引用（在 Visual Basic 中为 Nothing）。</param>
		/// <param name="dt">所插入对象将过期并被从缓存中移除的时间。若要避免可能出现的本地时间方面的问题（如从标准时间更改为夏时制），请对此参数值使用 UtcNow，不要使用 Now。如果使用绝对过期，则 slidingExpiration 参数必须为 NoSlidingExpiration</param>
		public static void Set(string key, object value, CacheDependency cacheDependency, DateTime dt)
		{
            if (value != null)
			    Cache.Insert(AppPrefix + key, value, cacheDependency, dt, TimeSpan.Zero);
		}
		
		/// <summary>
		/// 设置缓存
		/// </summary>
		/// <param name="name"></param>
		/// <param name="value"></param>
		/// <param name="cacheDependency">所插入对象的文件依赖项或缓存键依赖项。当任何依赖项更改时，该对象即无效，并从缓存中移除。如果没有依赖项，则此参数包含 nullNothingnullptrnull 引用（在 Visual Basic 中为 Nothing）。</param>
		/// <param name="ts">最后一次访问所插入对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟，则对象在最后一次被访问 20 分钟之后将过期并被从缓存中移除。如果使用可调过期，则 absoluteExpiration 参数必须为 NoAbsoluteExpiration。</param>
		public static void Set(string key, object value, CacheDependency cacheDependency, TimeSpan ts)
		{
            if (value != null)
			    Cache.Insert(AppPrefix + key, value, cacheDependency, Cache.NoAbsoluteExpiration, ts);
		}
		
		/// <summary>
		/// 设置缓存
		/// </summary>
		/// <param name="name"></param>
		/// <param name="value"></param>
		/// <param name="cacheDependency">所插入对象的文件依赖项或缓存键依赖项。当任何依赖项更改时，该对象即无效，并从缓存中移除。如果没有依赖项，则此参数包含 nullNothingnullptrnull 引用（在 Visual Basic 中为 Nothing）。</param>
		/// <param name="dt">所插入对象将过期并被从缓存中移除的时间。若要避免可能出现的本地时间方面的问题（如从标准时间更改为夏时制），请对此参数值使用 UtcNow，不要使用 Now。如果使用绝对过期，则 slidingExpiration 参数必须为 NoSlidingExpiration</param>
		/// <param name="ts">最后一次访问所插入对象时与该对象过期时之间的时间间隔。如果该值等效于 20 分钟，则对象在最后一次被访问 20 分钟之后将过期并被从缓存中移除。如果使用可调过期，则 absoluteExpiration 参数必须为 NoAbsoluteExpiration。</param>
		public static void Set(string key, object value, CacheDependency cacheDependency, DateTime dt, TimeSpan ts)
		{
            if (value != null)
			    Cache.Insert(AppPrefix + key, value, cacheDependency, dt, ts);
		}

		/// <summary>
		/// 设置缓存
		/// </summary>
		/// <param name="key"></param>
		/// <param name="value"></param>
		/// <param name="cacheDependency">该项的文件依赖项或缓存键依赖项。当任何依赖项更改时，该对象即无效，并从缓存中移除。如果没有依赖项，则此参数包含 null。</param>
		/// <param name="absoluteExpiration">所插入对象将过期并被从缓存中移除的时间。若要避免可能出现的本地时间方面的问题（如从标准时间更改为夏时制），请对此参数值使用 UtcNow，不要使用 Now。如果使用绝对过期，则 slidingExpiration 参数必须为 NoSlidingExpiration</param>
		/// <param name="slidingExpiration">最后一次访问所插入对象时与该对象到期时之间的时间间隔。如果该值等效于 20 分钟，则对象在最后一次被访问 20 分钟之后将到期并被从缓存中移除。如果使用可调到期，则 absoluteExpiration 参数必须为 NoAbsoluteExpiration。</param>
		/// <param name="onUpdate">在从缓存中移除对象时将调用的委托（如果提供）。当从缓存中删除应用程序的对象时，可使用它来通知应用程序。</param>
		public static void Set(string key, object value, CacheDependency cacheDependency, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemRemovedCallback onUpdate)
		{
            if (value != null)
  			    Cache.Insert(AppPrefix + key, value, cacheDependency, absoluteExpiration, slidingExpiration, CacheItemPriority.Normal, onUpdate);
		}

		/// <summary>
		/// 设置缓存
		/// </summary>
		/// <param name="key"></param>
		/// <param name="value"></param>
		/// <param name="cacheDependency">该项的文件依赖项或缓存键依赖项。当任何依赖项更改时，该对象即无效，并从缓存中移除。如果没有依赖项，则此参数包含 null。</param>
		/// <param name="absoluteExpiration">所插入对象将过期并被从缓存中移除的时间。若要避免可能出现的本地时间方面的问题（如从标准时间更改为夏时制），请对此参数值使用 UtcNow，不要使用 Now。如果使用绝对过期，则 slidingExpiration 参数必须为 NoSlidingExpiration</param>
		/// <param name="slidingExpiration">最后一次访问所插入对象时与该对象到期时之间的时间间隔。如果该值等效于 20 分钟，则对象在最后一次被访问 20 分钟之后将到期并被从缓存中移除。如果使用可调到期，则 absoluteExpiration 参数必须为 NoAbsoluteExpiration。</param>
		/// <param name="priority">优先级</param>
		/// <param name="onUpdate">在从缓存中移除对象时将调用的委托（如果提供）。当从缓存中删除应用程序的对象时，可使用它来通知应用程序。</param>
		public static void Set(string key, object value, CacheDependency cacheDependency, DateTime absoluteExpiration, TimeSpan slidingExpiration, CacheItemPriority priority, CacheItemRemovedCallback onUpdate)
		{
            if (value != null)
			    Cache.Insert(AppPrefix + key, value, cacheDependency, absoluteExpiration, slidingExpiration, priority, onUpdate);
		}
		#endregion

		#region 清除缓存
		/// <summary>
		/// 清除缓存
		/// </summary>
		/// <param name="name"></param>
		public static void Remove(string key)
		{
			Cache.Remove(AppPrefix + key);
		}
		#endregion

		#region 是否已缓存
		public static bool Contain(string key)
		{
			return Cache.Get(AppPrefix + key) != null;
		}
		#endregion
	}
}
